package com.example.rpccommon.protocol;

import com.example.rpccommon.util.SerializationUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class RpcDecoder extends ByteToMessageDecoder {

    //携带信息
    private Class<?> genericClass;

    public RpcDecoder(Class<?> genericClass){
        this.genericClass=genericClass;
    }

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf inputBuffer, List<Object> receiveOut) throws Exception {
        //字节对齐规则,这个HEAD_LENGTH是我们用于表示头长度的字节数,最小是int，那么最小等于4
        if(inputBuffer.readableBytes()<4){
            return;
        }
        //读标记readIndex的位置
        inputBuffer.markReaderIndex();
        //读取传送过来的消息的长度，ByteBuf 的readInt()方法会让他的readIndex增加4
        int dataLength = inputBuffer.readInt();
        //数据长度为空情况，可以选择关闭连接
        /*if (dataLength <= 0) {
            ctx.close();
        }*/
        //读到的消息体长度如果小于我们传送过来的消息长度,则resetReaderIndex. 进行配置重置更新readIndex，这个配合markReaderIndex使用的,把readIndex重置到mark的地方
        if (inputBuffer.readableBytes() < dataLength) {
            inputBuffer.resetReaderIndex();
            return;
    }
        //数据接收
        byte[] data = new byte[dataLength];
        //读取放到data里
        inputBuffer.readBytes(data);
        //使用ObjectMapper会有一些bug
        //数据类型转换
        Object obj = SerializationUtil.deserialize(data, genericClass);
        receiveOut.add(obj);
    }
}
